<?php
// 应用公共文件
use app\core\exception\ApiException;
use think\response\Json;
use think\Validate;


//全局定义消息状态返回类
const NET_SUCCESS = 1;//处理正确
const NET_ERROR = -1;//处理错误
const NOT_AUTH = 3;//没有登录
const NOT_PERMISSION = 4;//没有权限


/**
 * 返回处理api信息
 * @param $code :处理码
 * @param $msg :处理消息
 * @param array $data :处理后的数据
 * @param int $httpCode :http状态码
 * @return Json
 */
function res($code, $msg, $data = [], $httpCode = 200)
{
    return json(['code' => $code, 'msg' => $msg, 'data' => $data], $httpCode);
}

/**
 * 返回成功的数据
 * @param array $data
 * @return Json
 */
function showSuccess($data = [])
{
    return res(NET_SUCCESS, 'ok', $data);
}

/**
 * 打印调试信息
 * @param $title
 * @param $data
 */
function show_debug_info($title, $data)
{
    echo "<br><br><br>=================$title=========================<br><br><br>";
    print_r($data);
}

/**
 *返回处理成功的数据和消息
 * @param array $data
 * @param string $msg
 * @return Json
 */
function showSuccessWithMessage($msg = 'ok', $data = [])
{
    return res(NET_SUCCESS, $msg, $data);
}

/**
 * 处理失败后的返回
 * @param $message
 * @param int $code
 * @param array $data
 * @return Json
 */
function showError($message, $code = NET_ERROR, $data = [])
{
    return res($code, $message, $data);
}

/**
 * 错误处理类
 * @param string $string
 * @throws ApiException
 */
function error(string $string)
{
    throw  new ApiException($string);
}

/**
 * 用于验证数据字段是否更新
 * @param array $fields :可以更新的字段
 * @param array $data :更新的数组
 * @param array $model :更新的对象列
 * @return array
 */
function changeRowData(array $fields, array $data, array $model)
{

    if (!is_array($fields) || count($fields) == 0)
        throw new InvalidArgumentException('files 字段必须为数组');
    $arrKeys = array_keys($model);
    $resData = [];
    foreach ($fields as $field) {
        if (!in_array($field, $arrKeys))
            throw new InvalidArgumentException($field . " 该字段不存在于模型中");
        if (isset($data[$field]) && $data[$field] != '' && $data[$field] != null && $data[$field] != $model[$field])
            $resData[$field] = $data[$field];
    }
    return $resData;
}

/**
 * 验证数据
 * @access protected
 * @param array $data 数据
 * @param string|array $validate 验证器名或者验证规则数组
 * @param array $message 提示信息
 * @param bool $batch 是否批量验证
 * @return array|string|true
 * @throws ValidateException
 * @throws ApiException
 */
function validate(array $data, $validate, array $message = [], bool $batch = true)
{
    if (is_array($validate)) {
        $v = new Validate();
        $v->rule($validate);
    } else {
        if (strpos($validate, '.')) {
            // 支持场景
            [$validate, $scene] = explode('.', $validate);
        }
        $app = App::getInstance();
        $class = false !== strpos($validate, '\\') ? $validate : $app->parseClass('validate', $validate);
        $v = new $class();
        if (!empty($scene)) {
            $v->scene($scene);
        }
    }

    $v->message($message);

    // 是否批量验证
    if ($batch) {
        $v->batch(true);
    }
    if (!$v->check($data)) {
        $errors = $v->getError();
        throw new ApiException(array_values($errors)[0], 200, NET_ERROR, $v->getError());
    }
}

Validate::maker(function ($validate) {
    $validate->extend('isExits', 'isExits');
});

/**
 * @param $content
 * @throws Exception
 */
function throwError($content)
{
    throw new Exception($content);
}

/**
 * 自定义验证规则   isExits,table.field,except
 * table验证的表名
 * field验证的字段，如果不存在则默认是id
 * except如果是该值就不在验证，排除验证的值
 * @param $value
 * @param $rule
 * @param array $data
 * @return string
 */
function isExits($value, $rule, $data = [], $filed = '', $fileName = '')
{
    $rules = explode(',', $rule);

    if (isset($rules[2]) && $rules[2] == $value) return true;//值是否和默认值相等
    if (!$value) return true;
    isset($rules[1]) || $rules[1] = 'id';//如果没有设置第二个参数，默认是id字段
    $className = "\app\model\\" . ucfirst($rules[0]) . "Model";
    $model = new $className();
    $item = $model->where($rules[1], $value)->find();
    if (!$item) {
        return $fileName . '对应的记录不存在';
    }
    return true;
}

//是否是有效的数组
function is_valid_array($array)
{
    return $array && is_array($array) && count($array) > 0;
}
